单片机通过串口发送十六进制格式的数据,十六进制字符转十六进制数字 您所在的位置:网站首页 c 字符串转换为16进制怎么转换的 单片机通过串口发送十六进制格式的数据,十六进制字符转十六进制数字

单片机通过串口发送十六进制格式的数据,十六进制字符转十六进制数字

2024-06-12 13:24| 来源: 网络整理| 查看: 265

        做项目时需要STM32通过串口发送十六进制格式的数据,而不是字符型的十六进制。

        发送的原始数据通常是整型,例如1360984,经过转换成十六进制后变成字符14C458,我们需要发送的不是字符格式的14C458,也不是字符格式的0x14 0xC4 0x58,而是hex格式的0x14 0xC4 0x58,在串口助手hex显示下通常为14 C4 58。

        区别如下,左边是文本模式,右边是hex模式

        这个问题困扰了我好几天,翻遍了网上的各种文章也没有找到一个合适的解决方法,大多数讲的都是发送字符格式的14C458,或者字符格式的0x14 0xC4 0x58。

        其实了解串口数据的原理以及ASCII码对应十六进制的关系之后,几行代码就能搞定。

        由上表可以看出,我们发送十六进制的14,那么串口应该发送对应的ASII码20,

发送十六进制的58,串口应该发送对应的ASII码88,

发送十六进制的c4也是以此类推。

而ASCII码其实是十进制的,我们只需要把十六进制两位两位取出来,再转成十进制字符,用串口直接发送就能得到十六进制格式的数据了。

验证一下:

可以看出是正确的

代码实现:

需要注意变量的类型,容易出错

int sendData = 1360984;//样例数据 char stringHEX[6];//十六进制字符存放区 char temp[2];//转换缓存 char Send_ascii1,Send_ascii2,Send_ascii3; while (1) { sprintf(stringHEX,"%06x",sendData); //转化为十六进制字符,用0补齐6位 temp[0] = stringHEX[0]; //取出并缓存,便于使用trtol函数 temp[1] = stringHEX[1]; Send_ascii1 = strtol(temp,NULL,16); //16进制转对应ASCII码(即转为十进制) temp[0] = stringHEX[2]; temp[1] = stringHEX[3]; Send_ascii2 = strtol(temp,NULL,16); temp[0] = stringHEX[4]; temp[1] = stringHEX[5]; Send_ascii3 = strtol(temp,NULL,16); UART1_printf("%c%c%c",Send_ascii1,Send_ascii2,Send_ascii3); //串口发送 HAL_Delay(1000); }

sprintf函数是将整型格式化为字符串

strtol函数是将字符串转化为十进制数

都是stdlib.h里面提供的函数,具体用法可以自己搜

UART1_printf是串口重向定义

测试几组数据

9158734——使用十六进制在线转换结果为8BC04E

串口结果:

2024328——使用十六进制在线转换结果为1EE388

串口结果:

结果都是正确的,说明这个思路完全正确,程序仅供参考,具体可以自己修改 



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有